/* --------------------------- (C) COPYRIGHT 2021 Fortiortech ShenZhen -----------------------------
    File Name      : main.c
    Author         : Fortiortech  Appliction Team
    Version        : V1.0
    Edit           : Leo.li
    Date           : 2021-11-06
    Description    : This file contains XX-XX-XX function used for Motor Control.
----------------------------------------------------------------------------------------------------
                                       All Rights Reserved
------------------------------------------------------------------------------------------------- */
/********************************************************************************
    Header Definition
********************************************************************************/
#include <MyProject.h>

/********************************************************************************
    Internal Routine Prototypes
********************************************************************************/
void HardwareInit(void);
void SoftwareInit(void);
void VREFConfigInit(void);
void DebugSet(void);
/********************************************************************************
    Macro & Structure Definition
********************************************************************************/

/********************************************************************************
    Function Definition
********************************************************************************/
/* -------------------------------------------------------------------------------------------------
    Function Name  : main()
    Description    : 主函数
    Date           : 2021-11-06
    Parameter      : None
------------------------------------------------------------------------------------------------- */
void main(void)
{
    uint16 PowerUpCnt = 0;
    
    /*********上电等待*********/
    for (PowerUpCnt = 0; PowerUpCnt < SystemPowerUpTime; PowerUpCnt++);
	 for (PowerUpCnt = 0; PowerUpCnt < SystemPowerUpTime; PowerUpCnt++);
	 for (PowerUpCnt = 0; PowerUpCnt < SystemPowerUpTime; PowerUpCnt++);
	 for (PowerUpCnt = 0; PowerUpCnt < SystemPowerUpTime; PowerUpCnt++);
    
    /*********ADC参考电压电压配置*********/
    VREFConfigInit();
    /*********硬件过流，比较器初始化，用于硬件过流比较保护*********/
     /*********硬件FO过流，比较器初始化，用于硬件过流比较保护*********/
    #if (HardwareCurrent_Protect == Hardware_FO_Protect)     //外部中断初始化，用于外部中断硬件过流FO的保护
    INT0_Init();
    #elif (HardwareCurrent_Protect == Hardware_CMP_Protect)  //选择比较过流，比较器初始化
    CMP3_Init();
    #elif (HardwareCurrent_Protect == Hardware_FO_CMP_Protect)//两者都选择
    INT0_Init();
    CMP3_Init();
    #endif
    /*******************Hardware & Software Initial********************/
    HardwareInit();
	  
    SoftwareInit();
    //    DebugSet();
		
    ClrBit(CMP_SR, CMP3IF);    //板子存在问题，上电清楚硬件过流
    EA = 1;
    #if (PFCEnable==1)
    PFC_init();
    #endif
    
    /****************************************************************/
    while (1)
    {
		
        #if (PFCEnable==1)
        {
            GetPFCCurrentOffset();
            
            if (PFCSet.OffsetFlag == 1)
            {
                /* -----获取AMP0偏置电压----- */
                if (!mcCurOffset.OffsetFlag)
                {
                    GetCurrentOffset();
                }
                else
                {
                    /* -----电机控制状态机----- */
//                    MC_Control();
                }                                          // 主控函数，状态扫描 2.6k
            }
        }
        #else
        PFCSet.OffsetFlag = 1;
        
        /* -----获取AMP0偏置电压----- */
        if (!mcCurOffset.OffsetFlag)
        {
            GetCurrentOffset();
        }
        else
        {
            /* -----电机控制状态机----- */
            MC_Control();
        }                                          // 主控函数，状态扫描 2.6k
        
        #endif
    }
}

/*  -------------------------------------------------------------------------------------------------
    Function Name  : HardwareInit
    Description    : 硬件初始化，初始化需要使用的硬件设备配置，FOC必须配置的是运放电压、运放初始化、ADC初始化、Driver初始化
                    ，其他的可根据实际需求加。
    Date           : 2021-04-12
    Parameter      : None
    ------------------------------------------------------------------------------------------------- */
void HardwareInit(void)
{
    // 为提高芯片的抗干扰能力，降低芯片功耗，请在具体项目时，将不需要用的GPIO默认都配置为输入上拉。
    //具体配置可在GPIO_Default_Init设置。
    GPIO_Default_Init();
    /************************硬件外设初始化**************************/
    #if defined (SPI_DBG_HW)        // 硬件调试模式
    {
        SPI_Init();
        Set_DBG_DMA(&HARD_SPIDATA);
    }
    #elif defined (SPI_DBG_SW)      // 软件调试模式
    {
        SPI_Init();                 //调试模式下，占用SPI端口的NSS(GP04),MOSI(GP05),SCK(GP06)
        Set_DBG_DMA(spidebug);
    }
    #elif defined (UART_DBG)        // UART调试模式
    {
        UART2_Init();
        SetPipe_DMA0(DRAM_UART2);
    }
    #endif
    GPIO_Init();
    Driver_Init();
    ADC_Init();
    AMP_Init();
    Timer3_Init();
    /******温度配置初始化**********/
    //    TSD_Init();
    /******比较器中断配置**********/
    CMP3_Interrupt_Init();
    /*************************SYSTICK定时器配置**********************/
    ClrBit(IP2, PSYSTICK1);    //1ms定时中断优先级别为1
    SetBit(IP2, PSYSTICK0);    //
    SetBit(DRV_SR, SYSTIE);
}

/*  -------------------------------------------------------------------------------------------------
    Function Name  : SoftwareInit
    Description    : 软件初始化，初始化所有定义变量，按键初始化扫描
    Date           : 2021-04-12
    Parameter      : None
    ------------------------------------------------------------------------------------------------- */
void SoftwareInit(void)
{
    MotorcontrolInit();
    mcState       = mcReady;
    mcFaultSource = 0;
}

/*  -------------------------------------------------------------------------------------------------
    Function Name  : VREFConfigInit
    Description    : 配置VREF/VHALF输出
    Date           : 2021-04-12
    Parameter      : None
    ------------------------------------------------------------------------------------------------- */
void VREFConfigInit(void)
{
    /************************VREF&VHALF Config************************/
    #if (VREF_OUT_EN)
    SetBit(P3_AN, PIN5);                         //VREF Voltage -->P35 Output 是否输出到P35引脚，需同步配置输出
    SetBit(P3_OE, PIN5);                         //VREF Voltage -->P35 Output 是否输出到P35引脚
    #endif
    #if (VHALF_OUT_EN)
    SetBit(P3_AN, P32);
    #endif
    #if (HW_ADC_VREF==VREF3_0)
    {
        SetBit(VREF_VHALF_CR, VRVSEL1);             //00-->4.5V   01-->VDD5
        ClrBit(VREF_VHALF_CR, VRVSEL0);             //10-->3.0V   11-->4.0V
    }
    #elif (HW_ADC_VREF==VREF4_0)
    {
        SetBit(VREF_VHALF_CR, VRVSEL1);             //00-->4.5V   01-->VDD5
        SetBit(VREF_VHALF_CR, VRVSEL0);             //10-->3.0V   11-->4.0V
    }
    #elif (HW_ADC_VREF==VREF4_5)
    {
        ClrBit(VREF_VHALF_CR, VRVSEL1);             //00-->4.5V   01-->VDD5
        ClrBit(VREF_VHALF_CR, VRVSEL0);             //10-->3.0V   11-->4.0V
    }
    #else
    {
        ClrBit(VREF_VHALF_CR, VRVSEL1);             //00-->4.5V   01-->VDD5
        SetBit(VREF_VHALF_CR, VRVSEL0);             //10-->3.0V   11-->4.0V
    }
    #endif
    // VHALF电压配置 00:1/8VREF  01:1/4VREF 10:25/64VREF 11:1/2VREF(default)
    SetBit(VREF_VHALF_CR, VHALFSEL1);
    SetBit(VREF_VHALF_CR, VHALFSEL0);
    SetBit(VREF_VHALF_CR, VREFEN | VHALFEN);    //VREF_VHALF_CR = 0x11;
    /****************************************************************/
}

/*  -------------------------------------------------------------------------------------------------
        Function Name : void DebugSet(void)
        Description   : 调试模式配置
        Input         : 无
        Output        : 无
    -------------------------------------------------------------------------------------------------*/
void DebugSet(void)
{
    #if defined (SPI_DBG_HW)      // 硬件调试模式
    Set_DBG_DMA(&HARD_SPIDATA);
    #elif defined (SPI_DBG_SW)    // 软件调试模式
    Set_DBG_DMA(spidebug);
    #elif defined (UART_DBG)      // 串口调试模式
    UARTDebug_Init();
    #endif
    #if defined (SPI_DBG_HW) && defined (SPI_DBG_SW)
#error Only one DBG mode can be selected
    #endif
    /*******************Observation signal Select*********************/
    SetReg(CMP_CR3, DBGSEL0 | DBGSEL1, GP01_DBG_Conf);
    SetReg(CMP_CR3, CMPSEL0 | CMPSEL1 | CMPSEL2, GP07_DBG_Conf);
    /****************************总中断使能**************************/
}

